// * generator 函数（生成器函数）

// * generator 函数，与常规函数行为不同。在这类函数被调用时，它不会运行其代码，而是返回一个被称为 “generator object” 的特殊对象，来管理执行流程。

// 例子：
function* generateSequence() {
	yield 1
	yield 2
	return 3 // 执行到 return 语句时，函数执行完成。
}

let generator = generateSequence() // 返回一个 generator object（到目前为止，上面这个函数代码体中的内容还没有开始执行。）
console.log(generator) // Object [Generator] {}

// * 一个 generator 的主要方法就是 next()。
// * next() 的结果始终是一个具有两个属性的对象：1. value:（产出的 yielded 的值）。 2. done: 如果 generator 函数已执行完成则为 true，否则为 false。

let one = generator.next()
console.log('one', one) // { value: 1, done: false }

let two = generator.next()
console.log('two', two) // { value: 2, done: false }

let three = generator.next()
console.log('three', three) // { value: 3, done: true }

// *******************************************************************************************************************************************************

// * generator 是可迭代的

function* generateSequence1() {
	yield 1
	yield 2
	return 3 // return 返回的最终结果，不会被 for...of 遍历出来。
}

for (let value of generateSequence1()) {
	console.log(value) // 1 2
}

// **********************************************

function* generateSequence2() {
	yield 1
	yield 2
	yield 3 // 这样则会被 for...of 遍历出来。
}

for (let value of generateSequence2()) {
	console.log(value) // 1 2 3
}

// **********************************************

// generator 是可迭代的，所以可以使用 spread 语法 ...。

let sequence = [0, ...generateSequence2()]
console.log(sequence) // [0, 1, 2, 3];

// *******************************************************************************************************************************************************
